package com.obaamilos.accesscontrol;

import jade.core.Agent;
import jade.core.AID;
//import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import jade.domain.DFService;
import jade.domain.FIPAException;
import jade.domain.FIPAAgentManagement.DFAgentDescription;
import jade.domain.FIPAAgentManagement.ServiceDescription;

public class Manutencao extends Agent {
	/**
	 * 
	 */
	private static final long serialVersionUID = -8633177414766767022L;

	// Interface Gr�fica com o Usu�rio
	private ManutencaoGUI meuGui;
	
	private String strResposta;
	
	// Lista de agentes encontrados no ambiente
	private AID[] agentesQry;
	private AID[] agentesUpd;

	// Inicializa��o
	protected void setup() {
		// Aguarda agentes Query/Update subirem...
		try {
		    Thread.sleep(1000);
		} catch(InterruptedException ex) {
		    Thread.currentThread().interrupt();
		}		

		DFAgentDescription template_qry = new DFAgentDescription();
		ServiceDescription sd_qry = new ServiceDescription();
		sd_qry.setType("AgenteQuery");
		template_qry.addServices(sd_qry);
		// Obtem todos os agentes do ambiente que sejam do tipo AgenteQuery
		try {
			DFAgentDescription[] result = DFService.search(this, template_qry); 
			System.out.println("Encontrados os agentes query:");
			agentesQry = new AID[result.length];
			for (int i = 0; i < result.length; ++i) {
				agentesQry[i] = result[i].getName();
				System.out.println(agentesQry[i].getName());
			}
		}
		catch (FIPAException fe) {
			fe.printStackTrace();
		}

		DFAgentDescription template_upd = new DFAgentDescription();
		ServiceDescription sd_upd = new ServiceDescription();
		sd_upd.setType("AgenteUpdate");
		template_upd.addServices(sd_upd);
		try {
			DFAgentDescription[] result = DFService.search(this, template_upd); 
			System.out.println("Encontrados os agentes update:");
			agentesUpd = new AID[result.length];
			for (int i = 0; i < result.length; ++i) {
				agentesUpd[i] = result[i].getName();
				System.out.println(agentesUpd[i].getName());
			}
		}
		catch (FIPAException fe) {
			fe.printStackTrace();
		}

		// Cria e apresenta a interface 
		meuGui = new ManutencaoGUI(this);

        //meuGui.setQtdAgentesQry(agentesQry.length);
        //meuGui.setQtdAgentesUpd(agentesUpd.length);

		meuGui.showGui();
		
		// Busca usu�rios...
		meuGui.setbIncluindo(true);
		atualizaListaUsuarios();
		// Busca perfis...
		atualizaListaPerfis();
		meuGui.setbIncluindo(false);
		if (meuGui.getLstUsuariosModel().getSize() > 0) {
			String [] campos = meuGui.getLstUsuarios().getSelectedValue().toString().split(" - ");
			if (campos.length > 1) {
				atualizaListaPerfisUsuario(campos[1]);
			}
		}
		// Busca resursos...
		atualizaRecursos();
		
		// Add the behaviour serving queries from buyer agents
		//addBehaviour(new OfferRequestsServer());

		// Add the behaviour serving purchase orders from buyer agents
		//addBehaviour(new PurchaseOrdersServer());
	}
	
	public void atualizaListaUsuarios() {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?n ?u ?l ?p "+System.getProperty("line.separator")+
				"WHERE { ?u a ca:User . ?u ca:loginIs ?l . ?u ca:nameIs ?n . ?u ca:passwordIs ?p }";

		meuGui.getLstUsuariosModel().clear();
		meuGui.getLstUsuariosTesteModel().clear();

		strResposta = "";
		EnviaQuery(m_comando);
		String [] mUsu = strResposta.split(System.getProperty("line.separator"));
		if (mUsu.length > 1 && mUsu[1].contains(", ")) {
			String mUsul1, mUsul2;
			for (int i=1; i < mUsu.length; i++) {
				mUsul1 = mUsu[i].replace(", ",  " - ");
				mUsul2 = mUsul1.substring(0,mUsul1.indexOf(" - ")) + "]";
				meuGui.getLstUsuariosModel().addElement(mUsul1);
				meuGui.getLstUsuariosTesteModel().addElement(mUsul2);
			}
			if (mUsu.length > 1) {
				meuGui.getLstUsuarios().setSelectedIndex(0);
				meuGui.getLstUsuariosTeste().setSelectedIndex(0);
			}
		}
		//System.out.println("Atualizou usu�rios...");
	}
	
	public void atualizaListaPerfis() {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?u "+System.getProperty("line.separator")+
				"WHERE { ?u a ca:Access }";
		
		meuGui.getLstPerfisModel().clear();
		meuGui.getLstPerfisAAssociarModel().clear();

		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst = strResposta.split(System.getProperty("line.separator"));
		for (int i=1; i < mLst.length; i++) {
			meuGui.getLstPerfisModel().addElement(mLst[i]);
			meuGui.getLstPerfisAAssociarModel().addElement(mLst[i]);
		}
		if (mLst.length > 1) {
			meuGui.getLstPerfis().setSelectedIndex(0);
			meuGui.getLstPerfisAAssociar().setSelectedIndex(0);
		}
		//System.out.println("Atualizou perfis...");
	}
	
	public void atualizaAcoesPerfil(String pPerfil) {
		meuGui.getLstAcoesPerfilModel().clear();

		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?p "+System.getProperty("line.separator")+
				"WHERE { ca:"+pPerfil+" ca:hasResource ?p }";
		
		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst = strResposta.split(System.getProperty("line.separator"));

		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?p "+System.getProperty("line.separator")+
				"WHERE { ca:"+pPerfil+" ca:hasAction ?p }";
		
		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst2 = strResposta.split(System.getProperty("line.separator"));
		
		if (mLst.length == mLst2.length) {
			for (int i=1; i < mLst.length; i++) {
				meuGui.getLstAcoesPerfilModel().addElement(mLst[i].replace("]", "")+" - "+mLst2[i].replace("[", ""));
			}
			if (mLst.length > 1) {
				meuGui.getLstAcoesPerfil().setSelectedIndex(0);
			}
		}
	}

	public void atualizaRecursos() {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?u"+System.getProperty("line.separator")+
				"WHERE { ?u a ca:Learning_Object }";

		meuGui.getLstRecursosModel().clear();
		meuGui.getLstRecursosAcaoModel().clear();
		meuGui.getLstRecursosTesteModel().clear();
		meuGui.getLstRecursosModel().addElement("[AnyResource]");
		meuGui.getLstRecursosAcaoModel().addElement("[AnyResource]");
		meuGui.getLstRecursosTesteModel().addElement("[AnyResource]");

		String mNomeRecurso;
		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst = strResposta.split(System.getProperty("line.separator"));
		for (int i=1; i < mLst.length; i++) {
			mNomeRecurso = mLst[i].replace("[", "[Learning_Object - ");
			meuGui.getLstRecursosModel().addElement(mNomeRecurso);
			meuGui.getLstRecursosAcaoModel().addElement(mNomeRecurso);
			meuGui.getLstRecursosTesteModel().addElement(mNomeRecurso);
		}
		
		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?u"+System.getProperty("line.separator")+
				"WHERE { ?u a ca:Application }";
		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst2 = strResposta.split(System.getProperty("line.separator"));
		for (int i=1; i < mLst2.length; i++) {
			mNomeRecurso = mLst2[i].replace("[", "[ApplicationAsResource - ");
			meuGui.getLstRecursosModel().addElement(mNomeRecurso);
			meuGui.getLstRecursosAcaoModel().addElement(mNomeRecurso);
			meuGui.getLstRecursosTesteModel().addElement(mNomeRecurso);
		}
		meuGui.getLstRecursos().setSelectedIndex(0);
		meuGui.getLstRecursosAcao().setSelectedIndex(0);
		meuGui.getLstRecursosTeste().setSelectedIndex(0);
	}
	
	public void atualizaListaPerfisUsuario(String pUsuario) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?x "+System.getProperty("line.separator")+
				"WHERE { ca:"+pUsuario+" ca:hasAccess ?x }";
		
		meuGui.getLstPerfisUsuarioModel().clear();

		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst = strResposta.split(System.getProperty("line.separator"));
		for (int i=1; i < mLst.length; i++) {
			meuGui.getLstPerfisUsuarioModel().addElement(mLst[i]);
		}
	}
	
	public boolean existeUsuario(String pLogin) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?u "+System.getProperty("line.separator")+
				"WHERE { ?u a ca:User . ?u ca:loginIs \""+pLogin+"\"^^xsd:string }";
		strResposta = "";
		EnviaQuery(m_comando);
		String [] mUsu = strResposta.split(System.getProperty("line.separator"));
		return(mUsu.length > 1);
	}
	
	public void excluirRecursoAcaodePerfil(String pPerfil, String pRecurso, String pAcao) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ca:"+pPerfil+" ca:hasAction ca:"+pAcao+" }";
		strResposta = "";
		EnviaUpdate(m_comando);

		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ca:"+pPerfil+" ca:hasResource ca:"+pRecurso+" }";
		strResposta = "";
		EnviaUpdate(m_comando);
		atualizaAcoesPerfil(pPerfil);
	}

	public void incluirRecursoAcaoemPerfil(String pPerfil, String pRecurso, String pAcao) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"INSERT { ca:"+pPerfil+" ca:hasResource ca:"+pRecurso+" }"+System.getProperty("line.separator")+
				"WHERE { BIND(now() AS ?now) }";
		strResposta = "";
		EnviaUpdate(m_comando);

		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"INSERT { ca:"+pPerfil+" ca:hasAction ca:"+pAcao+" }"+System.getProperty("line.separator")+
				"WHERE { BIND(now() AS ?now) }";
		strResposta = "";
		EnviaUpdate(m_comando);
		atualizaAcoesPerfil(pPerfil);
	}

	public void excluirUsuario(String pUsuario) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ca:"+pUsuario+" ?o ?x }";
		strResposta = "";
		EnviaUpdate(m_comando);
		// Atualiza os usuarios...
		meuGui.setbIncluindo(true);
		atualizaListaUsuarios();
		meuGui.setbIncluindo(false);
	}

	public void excluirAcesso(String pAcesso) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ca:"+pAcesso+" ?o ?x }";
		strResposta = "";
		EnviaUpdate(m_comando);
		// Exclui referencias a este acesso
		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ?s ?o ca:"+pAcesso+" }";
		strResposta = "";
		EnviaUpdate(m_comando);
	}
	
	public void excluirRecurso(String pRecurso) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ca:"+pRecurso+" ?o ?x }";
		strResposta = "";
		EnviaUpdate(m_comando);

		// Excluir todos os perfis (acessos) deste recurso excluido...
		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"SELECT ?u"+System.getProperty("line.separator")+
				"WHERE { ?u a ca:Access . ?u ca:hasResource* ca:"+pRecurso+" }";
		String mAcesso;
		strResposta = "";
		EnviaQuery(m_comando);
		String [] mLst = strResposta.split(System.getProperty("line.separator"));
		for (int i=1; i < mLst.length; i++) {
			mAcesso = mLst[i].replace("[", "");
			mAcesso = mAcesso.replace("]", "");
			excluirAcesso(mAcesso);
		}
		
		// Atualiza os acessos...
		atualizaListaPerfis();
		// Atualiza os recursos...
		atualizaRecursos();
		// Atualiza lista de perfis do usu�rio selecionado...
		if (meuGui.getLstUsuariosModel().getSize() > 0) {
			String [] campos = meuGui.getLstUsuarios().getSelectedValue().toString().split(" - ");
			if (campos.length > 1) {
				atualizaListaPerfisUsuario(campos[1]);
			}
		}
	}

	public void excluirPerfilUsuario(String pUsuario, String pPerfil) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"DELETE WHERE { ca:"+pUsuario+" ca:hasAccess ca:"+pPerfil+" }";
		strResposta = "";
		EnviaUpdate(m_comando);
		//System.out.println(m_comando);
		// Atualiza perfis do usu�rio
		atualizaListaPerfisUsuario(pUsuario);
	}
	
	public void associaPerfilUsuario(String pUsuario, String pPerfil) {
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"INSERT { ca:"+pUsuario+" ca:hasAccess ca:"+pPerfil+" }"+System.getProperty("line.separator")+
				"WHERE { BIND(now() AS ?now) }";
		strResposta = "";
		EnviaUpdate(m_comando);
		// Atualiza perfis do usu�rio
		atualizaListaPerfisUsuario(pUsuario);
	}
	
	public void incluirClasseInstancia(String pClasse, String pNome) {
		// User
		String m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"INSERT { ca:"+pNome+" rdf:type ca:"+pClasse+" }"+System.getProperty("line.separator")+
				"WHERE { BIND(now() AS ?now) }"; 
		strResposta = "";
		EnviaUpdate(m_comando);
		// NamedIndividual
		m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
				"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+System.getProperty("line.separator")+
				"PREFIX owl: <http://www.w3.org/2002/07/owl#>"+System.getProperty("line.separator")+
				"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
				"INSERT { ca:"+pNome+" rdf:type owl:NamedIndividual }"+System.getProperty("line.separator")+
				"WHERE { BIND(now() AS ?now) }"; 
		EnviaUpdate(m_comando);
	}

	public void incluirUsuario() {
		// Obtem os dados e valida (s� inclui se todos estiverem preenchidos)
		String mID, mNome, mLogin, mSenha, m_comando;
		
		mID = meuGui.getTxtID().getText().trim();
		mLogin = meuGui.getTxtLogin().getText().trim();
		mNome = meuGui.getTxtNome().getText().trim();
		mSenha = meuGui.getTxtSenha().getText().trim();
		
		if (mID.length() > 0 && mLogin.length() > 0 && mNome.length() > 0 && mSenha.length() > 0) {
			incluirClasseInstancia("User", mID);
			// Login
			m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
					"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
					"INSERT { ca:"+mID+" ca:loginIs \""+mLogin+"\"^^<http://www.w3.org/2001/XMLSchema#string> }"+System.getProperty("line.separator")+
					"WHERE { BIND(now() AS ?now) }"; 
			EnviaUpdate(m_comando);
			// Name
			m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
					"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
					"INSERT { ca:"+mID+" ca:nameIs \""+mNome+"\"^^<http://www.w3.org/2001/XMLSchema#string> }"+System.getProperty("line.separator")+
					"WHERE { BIND(now() AS ?now) }"; 
			EnviaUpdate(m_comando);
			// Senha
			m_comando = meuGui.getTxtLocalTDB().getText()+"<separa>"+System.getProperty("line.separator")+
					"PREFIX ca: <http://www.semanticweb.org/controle_acesso#>"+System.getProperty("line.separator")+
					"INSERT { ca:"+mID+" ca:passwordIs \""+mSenha+"\"^^<http://www.w3.org/2001/XMLSchema#string> }"+System.getProperty("line.separator")+
					"WHERE { BIND(now() AS ?now) }"; 
			EnviaUpdate(m_comando);

			// Limpa campos de entrada...
			meuGui.getTxtID().setText("");
			meuGui.getTxtLogin().setText("");
			meuGui.getTxtNome().setText("");
			meuGui.getTxtSenha().setText("");
			// Atualiza os usuarios...
			meuGui.setbIncluindo(true);
			atualizaListaUsuarios();
			meuGui.setbIncluindo(false);
		}
	}

	public void incluirRecurso(String pTipo) {    // pTipo = Learning_Object ou Application
		// Obtem os dados e valida (s� inclui se todos estiverem preenchidos)
		String mNome;
		
		mNome = meuGui.getTxtNomeRecurso().getText().trim();
		
		if (mNome.length() > 0) {
			mNome = mNome.replace(" ", "");
			incluirClasseInstancia(pTipo, mNome);
			// Limpa campo de entrada...
			meuGui.getTxtNomeRecurso().setText("");
			// Atualiza os Recursos...
			atualizaRecursos();
		}
	}
	
	public void incluirPerfil() {
		// Obtem os dados e valida (s� inclui se todos estiverem preenchidos)
		String mNome;
		
		mNome = meuGui.getTxtNomePerfil().getText().trim();
		
		if (mNome.length() > 0) {
			mNome = mNome.replace(" ", "");
			incluirClasseInstancia("Access", mNome);
			// Limpa campo de entrada...
			meuGui.getTxtNomePerfil().setText("");
			// Atualiza os Perfis...
			atualizaListaPerfis();
		}
	}
	
	private MessageTemplate mt;   // Template  para receber respostas
	
	public void EnviaQuery(final String pComando) {
		
		System.out.println("Iniciando teste, comando " + pComando);

		// Testa Query
		if (agentesQry.length > 0) {
			// Envia o comando a todos os agentes encontrados
			ACLMessage req = new ACLMessage(ACLMessage.REQUEST);
			for (int i = 0; i < agentesQry.length; ++i) {
				req.addReceiver(agentesQry[i]);
				System.out.println("Teste selecionou agente " + agentesQry[i].getName());
			}
			req.setContent(pComando);
			req.setConversationId("testa-query");
			req.setReplyWith("req"+System.currentTimeMillis()); // Valor �nico
			//myAgent.send(req);
			send(req);
			System.out.println("Teste enviou requisicao query");

			// Prepara "template" para receber respostas
			mt = MessageTemplate.and(MessageTemplate.MatchConversationId("testa-query"),
					MessageTemplate.MatchPerformative(ACLMessage.INFORM));

			ACLMessage resposta = blockingReceive(mt);
			if (resposta != null) {
				// Conjunto local do agentes recebido
				if (resposta.getPerformative() == ACLMessage.INFORM) {
					// Grava o retorno...
					System.out.println("Query Recebeu resposta n�o nula e INFORM");
					strResposta = resposta.getContent();
					
					//meuGui.setTxtResposta(strResposta);
				}
				else {
					System.out.println("Resposta inesperada.");
				}
				System.out.println("Query concluido.");
			}
		}
	}

	public void EnviaUpdate(final String pComando) {

		System.out.println("Iniciando comando update " + pComando);
		
		// Testa Update
		if (agentesUpd.length > 0) {
			// Envia o comando a todos os agentes encontrados
			ACLMessage req = new ACLMessage(ACLMessage.REQUEST);
			for (int i = 0; i < agentesUpd.length; ++i) {
				req.addReceiver(agentesUpd[i]);
				System.out.println("Teste selecionou agente " + agentesUpd[i].getName());
			} 
			req.setContent(pComando);
			req.setConversationId("testa-update");
			req.setReplyWith("req"+System.currentTimeMillis()); // Valor �nico
			//myAgent.send(req);
			send(req);
			System.out.println("Teste enviou requisicao update");

			// Prepara "template" para receber respostas
			mt = MessageTemplate.and(MessageTemplate.MatchConversationId("testa-update"),
					MessageTemplate.MatchPerformative(ACLMessage.INFORM));
			
			ACLMessage resposta = blockingReceive(mt);

			if (resposta != null) {
				// Conjunto local do agentes recebido
				if (resposta.getPerformative() == ACLMessage.INFORM) {
					// Grava o retorno...
					System.out.println("Update Recebeu resposta n�o nula e INFORM");
					
					strResposta = resposta.getContent();
					
					//meuGui.setTxtResposta(strResposta);
				}
				else {
					System.out.println("Resposta inesperada.");
				}
				System.out.println("Update concluido.");
			}
		}
	}

	// Opera��o de shutDown
	protected void takeDown() {
		// Fecha o GUI
		meuGui.dispose();
		// Apresenta uma mensagem de sa�da
		System.out.println("Agente TestaAgentes "+getAID().getName()+" encerrando.");
	}
}
